﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using IQReportes.Utils;

namespace IQReportes.Models
{
    public class LogicaGeneral
    {
        private DirDAO dbDirs = new DirDAO();

        public void cargarDiccionariosTree(Dictionary<string, int> diccionarioDirsXLocal, 
                                           Dictionary<string, string> diccionarioLocalXCodigo,
                                           Dictionary<string, List<string>> diccionarioLocalesXDistrito,
                                           List<Ubigeo> listaUbigeo, Dictionary<string, string> diccionarioDistritos)
        {
            try
            {
                //para obtener los numeros de dir por local
                var listaDirXLocal = dbDirs.dirs.GroupBy(a =>
                    new
                    {
                        a.vcCodLocal
                    }).Select(a => new
                    {
                        codLocal = a.Key.vcCodLocal,
                        numDirs = a.Select(x => x.vcCodDIR).Distinct().Count()
                    });

                foreach (var item in listaDirXLocal)
                {
                    diccionarioDirsXLocal.Add(item.codLocal, item.numDirs);
                }

                //para obtener los nombre de locales unicos
                var listaLocalXCodigo = dbDirs.dirs.GroupBy(a =>
                    new
                    {
                        a.vcCodLocal,
                        a.vcLocal
                    }).Select(a => new
                    {
                        codLocal = a.Key.vcCodLocal,
                        nombreLocal = a.Key.vcLocal
                    });
                //
                string espacios;
                foreach (var loc in listaLocalXCodigo)
                {
                    espacios = Constantes.CADENA_VACIA;
                    while (true)
                    {
                        if (diccionarioLocalXCodigo.ContainsValue(loc.nombreLocal))
                        {
                            espacios = espacios + " ";
                        }
                        else
                        {
                            diccionarioLocalXCodigo.Add(loc.codLocal, loc.nombreLocal + espacios);
                            break;
                        }
                    }
                }

                //para obtener los locales por distrito
                var listaLocalXdistrito = dbDirs.dirs.GroupBy(a =>
                    new
                    {
                        a.vcCodLocal,
                        a.vcCodDistrito
                    }).Select(a => new
                    {
                        codLocal = a.Key.vcCodLocal,
                        codDistrito = a.Key.vcCodDistrito
                    }).OrderBy(a => a.codDistrito);

                List<string> listaLocales;

                foreach (var item in listaLocalXdistrito)
                {
                    if (!diccionarioLocalesXDistrito.ContainsKey(item.codDistrito))
                    {
                        listaLocales = new List<string>();
                        listaLocales.Add(item.codLocal);
                        diccionarioLocalesXDistrito.Add(item.codDistrito, listaLocales);
                    }
                    else
                    {
                        diccionarioLocalesXDistrito[item.codDistrito].Add(item.codLocal);
                    }
                }

                //para obtener los nombres de distrito unicos
                
                //listaUbigeo = dbDirs.ubigeos.ToList();

                foreach (Ubigeo u in listaUbigeo)
                {
                    espacios = Constantes.CADENA_VACIA;
                    while (true)
                    {
                        if (diccionarioDistritos.ContainsValue(u.vcDistrito + espacios))
                        {
                            espacios = espacios + " ";
                        }
                        else
                        {
                            diccionarioDistritos.Add(u.vcCodDistrito, u.vcDistrito + espacios);
                            break;
                        }
                    }
                }

                //departamentos

            }
            catch (Exception e)
            {
                string gg = e.Message;
            }
        }

        
        public List<String> obtenerProvinciasXDepartamento(string nombreDepartamento, List<String> provincias, 
                                                           List<Ubigeo> listaUbigeo)
        {
            List<String> retorno = new List<String>();
            try
            {
                var provs = listaUbigeo.AsEnumerable().Where(a => a.vcDepartamento ==
                    nombreDepartamento).GroupBy(a => a.vcProvincia).Select(k => new { Provincia = k.Key }).ToList();


                foreach (var u in provs)
                {
                    provincias.Add(u.Provincia);
                    retorno.Add(u.Provincia + " Prov.");
                }
                return retorno;
            }
            catch (Exception e)
            {
                string gg = e.Message;
            }
            return null;
        }

        public List<String> obtenerDistritosXProvincia(string departamento, string provincia, List<String> distritos,
                                                       List<Ubigeo> listaUbigeo, Dictionary<string, string> diccionarioDistritos)
        {
            List<String> retorno = new List<String>();
            try
            {
                var dist = listaUbigeo.AsEnumerable().Where(a => a.vcDepartamento ==
                    departamento && a.vcProvincia == provincia).GroupBy(a => a.vcCodDistrito).Select(
                    k => new { Distrito = k.Key }).ToList();

                foreach (var u in dist)
                {
                    distritos.Add(u.Distrito);
                    retorno.Add(diccionarioDistritos[u.Distrito] + " Dist.");
                }
                return retorno;
            }
            catch (Exception e)
            {
                string gg = e.Message;
            }
            return null;
        }

        public List<String> obtenerLocalesXdistrito(List<String> listaLocales, string codDistrito,
                                                    Dictionary<string, List<string>> diccionarioLocalesXDistrito,
                                                    Dictionary<string, string> diccionarioLocalXCodigo)
        {
            try
            {
                List<String> retorno = new List<String>();
                if (diccionarioLocalesXDistrito.ContainsKey(codDistrito))
                {
                    foreach (string codLocal in diccionarioLocalesXDistrito[codDistrito])
                    {
                        retorno.Add(diccionarioLocalXCodigo[codLocal]);
                        listaLocales.Add(codLocal);
                    }

                }
                else
                {
                    retorno = null;
                }
                return retorno;

            }
            catch (Exception e)
            {
                string gg = e.Message;
            }
            return null;

        }
    }
}